import { BaseStorage } from '@2/app/core/storage/base.storage';
import { StateTree } from 'pinia';
import { SocialToken } from '@2/typings/oauth2';
import { AppUser } from '@2/typings/model/app.user';
import { PermissionModel } from '@2/typings/model/permission.model';

/**
 * @program: microservice-central-portal
 * @description: 用户定义存储接口
 * @author: baiHoo.chen
 * @create: 2022年5月26日
 **/
export interface UserStorage extends BaseStorage<UserState> {
  /**
   * 设置登陆用户信息
   * @param appUser 平台登陆登陆用户信息（允许为 undefined）
   */
  setAppUser(appUser: AppUser | null): void;
  /**
   * 返回存储的登陆用户信息
   * @return 平台登陆登陆用户信息（允许为 undefined）
   */
  getAppUser(): AppUser;
  /**
   *
   * @param permissions {@link PermissionModel}
   */
  setAppUserWithPermission(permissions: PermissionModel[]): void;
  /**
   * 返回登陆用户令牌 TOKEN 凭证
   * @return 登陆用户令牌 TOKEN 凭证，令牌（允许为 undefined）
   */
  getToken(): SocialToken | undefined;
  /**
   * 重新设置登陆用户令牌 TOKEN 凭证
   * @param token 登陆用户令牌 TOKEN 凭证，令牌（允许为 undefined）
   */
  setToken(token: SocialToken | undefined): void;
  /**
   * 指示帐户会话（session）信息是否已过期。过期的帐户不能为已验证。
   * @return 如果帐户会话（session）信息有效（即未过期），则返回 true，如果不再有效（即过期），则为 false
   */
  isSessionNonExpired(): boolean;
  /**
   * 设置帐户会话（session）信息是否已过期。过期的帐户不能为已验证。
   * @param expired 如果设置 true 即帐户会话（session）信息仍有效（即未过期），否则设置 false，即账户会话（session）信息立即不再有效（即过期）
   */
  setSessionNonExpired(expired: boolean): void;
  /**
   * 返回用户的最有一次更新时间
   * @return 用户最有一次更新时间，更新时间（不能为 undefined）
   */
  getLastUpdateTime(): number;
}
/**
 * @program: microservice-central-portal
 * @description: 用于定义用户存储的所有状态，具体使用 {@see UserStorageImpl}
 * @author: baiHoo.chen
 * @create: 2022年5月29日
 **/
export interface UserState extends StateTree {
  // 平台登陆用户状态信息，用户名（不能为 undefined）
  LoginAppUser: Nullable<AppUser>;
  // 登陆用户令牌 TOKEN 凭证，令牌（允许为 undefined）
  token?: SocialToken;
  // 如果设置 true 即帐户会话（session）信息仍有效（即未过期），否则设置 false，即账户会话（session）信息立即不再有效（即过期）
  sessionNonExpired: boolean;
  // 用户的最有一次更新时间
  lastUpdateTime: number;
}
